package com.ai.speek;

import java.util.LinkedList;
import java.util.Queue;

import com.base.SnThread;
import com.iflytek.cloud.speech.SpeechConstant;
import com.iflytek.cloud.speech.SpeechError;
import com.iflytek.cloud.speech.SpeechSynthesizer;
import com.iflytek.cloud.speech.SynthesizerListener;

/**
 * @Description 语音播放
 * @ClassName Speeker
 * @Date 2017年8月10日 下午3:07:30
 * @Author yanghao Copyright (c) All Rights Reserved, 2017.
 */
public class Speeker {

	// 语音内容队列
	private static Queue<String> speekQueue = new LinkedList<String>();
	//
	private SpeechSynthesizer mTts = null;

	public Speeker() {
		if (mTts == null) {
			mTts = SpeechSynthesizer.createSynthesizer();
			// 2.合成参数设置，详见《iFlytek MSC Reference Manual》SpeechSynthesizer 类
			mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");// 设置发音人
			mTts.setParameter(SpeechConstant.SPEED, "70");// 设置语速
			mTts.setParameter(SpeechConstant.VOLUME, "100");// 设置音量，范围0~100
			// 设置合成音频保存位置（可自定义保存位置），保存在“./iflytek.pcm”
			// 如果不需要保存合成音频，注释该行代码
			// mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH,"./busy.pcm");
		}
	}

	// 输入
	public void say(String content) {
		speekQueue.offer(content);
		play();
	}
	
	private boolean speaking = false;

	// 输出
	public void play() {
		// System.out.println(speekQueue);
		if (speaking) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			play();
		}else{
			String content = speekQueue.poll();
			if(content!=null&&!"".equals(content)){
				mTts.startSpeaking(content, mSynListener);
			}
		}
	}

	// 合成监听器
	private SynthesizerListener mSynListener = new SynthesizerListener() {
		// 会话结束回调接口，没有错误时，error为null
		public void onCompleted(SpeechError error) {
			if (error != null) {
				error.printStackTrace();
			}
			speaking = false;
			// 播放下个语音
			play();
		}

		// 缓冲进度回调
		public void onBufferProgress(int percent, int beginPos, int endPos, String info) {
		}

		// 开始播放
		public void onSpeakBegin() {
			speaking = true;
		}

		// 暂停播放
		public void onSpeakPaused() {
			speaking = false;
		}

		// 播放进度回调
		public void onSpeakProgress(int percent, int beginPos, int endPos) {
		}

		// 恢复播放回调接口
		public void onSpeakResumed() {
		}
	};

}
